home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / mamesrc / src / amiga / gfx.s < prev    next >
Encoding:
Text File  |  1999-12-03  |  20.4 KB  |  1,288 lines

  1. ***************************************************************************
  2. *
  3. * Copyright (C) 1999 Mats Eirik Hansen (mats.hansen@triumph.no)
  4. *
  5. * CUSTOMDRAWGFX and CUSTOMMEM aren't working with MAME 0.31 and later.
  6. * I haven't bothered fixing them as they apparently gave no speed increase.
  7. *
  8. * $Id: gfx.s,v 1.1 1999/04/28 18:52:25 meh Exp $
  9. *
  10. * $Log: gfx.s,v $
  11. * Revision 1.1  1999/04/28 18:52:25  meh
  12. * Initial revision
  13. *
  14. *
  15. ***************************************************************************
  16.  
  17.     INCDIR    include:,myinclude:
  18.  
  19.     INCLUDE    "exec/types.i"
  20.  
  21.     IFD DEBUG
  22.     INCLUDE    "system.gs"
  23.     INCLUDE    "macros.i"
  24.     ENDC
  25.  
  26.     IFD CUSTOMDRAWGFX
  27.     XDEF    _drawgfx_core8
  28.     XDEF    _clearbitmap
  29.     ENDC
  30.  
  31.     XDEF    _RemapPixels
  32.  
  33.     IFD CUSTOMMEM
  34.     XDEF    _mrh_ram
  35.     XDEF    _mrh_error
  36.     XDEF    _mrh_bank1
  37.     XDEF    _mrh_bank2
  38.     XDEF    _mrh_bank3
  39.     XDEF    _mrh_bank4
  40.     XDEF    _mrh_bank5
  41.     XDEF    _mrh_nop
  42.     XDEF    _mrh_error_sparse
  43.     XDEF    _mwh_ram
  44.     XDEF    _mwh_error
  45.     XDEF    _mwh_bank1
  46.     XDEF    _mwh_bank2
  47.     XDEF    _mwh_bank3
  48.     XDEF    _mwh_bank4
  49.     XDEF    _mwh_bank5
  50.     XDEF    _mwh_nop
  51.     XDEF    _mwh_error_sparse
  52.     XDEF    _mwh_rom
  53.     XDEF    _mwh_ramrom
  54.     XDEF    _cpu_readmem16
  55.     XDEF    _cpu_writemem16
  56.     XDEF    _cpu_readmem20
  57.     XDEF    _cpu_writemem20
  58.     XDEF    _cpu_readmem24
  59.     XDEF    _cpu_writemem24
  60.     ENDC
  61.  
  62. ;    XDEF    break
  63.  
  64.     XREF    _Machine    ; -> RunningMachine structure.
  65.     XREF    _remappedtable
  66.  
  67.     IFD CUSTOMMEM
  68.     XREF    _RAM
  69.     XREF    _ROM
  70.     XREF    _cpu_bankbase
  71.     XREF    _cur_mrhard
  72.     XREF    _readhardware
  73.     XREF    _memoryreadoffset
  74.     XREF    _memoryreadhandler
  75.     XREF    _cur_mwhard
  76.     XREF    _writehardware
  77.     XREF    _memorywriteoffset
  78.     XREF    _memorywritehandler
  79.     ENDC
  80.  
  81. ;    XREF    _DeltaW
  82. ;    XREF    _DeltaH
  83. ;    XREF    _DeltaWShift
  84. ;    XREF    _DeltaHShift
  85. ;    XREF    _DeltaBuf
  86.  
  87.     XREF    _DOSBase
  88.  
  89. MAX_GFX_ELEMENTS    = 20
  90. MAX_MEMORY_REGIONS    = 10
  91. MAX_PENS        = 256
  92. MAX_LAYERS        = 4
  93.  
  94. TRANS_NONE    = 0
  95. TRANS_PEN    = 1
  96. TRANS_COLOR    = 2
  97. TRANS_THROUGH    = 3
  98.  
  99.     BITDEF    ORIENT,FLIP_X,0
  100.     BITDEF    ORIENT,FLIP_Y,1
  101.     BITDEF    ORIENT,SWAP_XY,2
  102.  
  103. ABITS2_16    = 4
  104. ABITS_MIN_16    = 0
  105. ABITS2_20    = 8
  106. ABITS_MIN_20    = 0
  107. ABITS2_24    = 8
  108. ABITS_MIN_24    = 2
  109. MH_SBITS    = 8
  110. MH_HARDMAX    = 64
  111.  
  112.     STRUCTURE DrawGfxArgs,0
  113.         APTR    dga_BitMap
  114.         APTR    dga_GfxElement
  115.         LONG    dga_Code
  116.         LONG    dga_Color
  117.         LONG    dga_FlipX
  118.         LONG    dga_FlipY
  119.         LONG    dga_StartX
  120.         LONG    dga_StartY
  121.         APTR    dga_ClipRect
  122.         LONG    dga_Trans
  123.         LONG    dga_TransColor
  124.         LONG    dga_Dirty        ; _drawgfx_core only.
  125.  
  126.     STRUCTURE FillBitMapArgs,0
  127.         APTR    fbma_BitMap
  128.         LONG    fbma_Pen
  129.         APTR    fbma_ClipRect
  130.  
  131.     STRUCTURE OsdBitMap,0
  132.         LONG    obm_Width
  133.         LONG    obm_Height
  134.         LONG    obm_Depth
  135.         APTR    obm_Private
  136.         APTR    obm_Line
  137.  
  138.     STRUCTURE GfxElement,0
  139.         LONG    ge_Width
  140.         LONG    ge_Height
  141.         APTR    ge_BitMap
  142.         LONG    ge_TotalElements
  143.         LONG    ge_ColorGranuality
  144.         APTR    ge_ColorTable
  145.         LONG    ge_TotalColors
  146.         ULONG    ge_PenUsage
  147.  
  148.     STRUCTURE Rect,0
  149.         LONG    r_MinX
  150.         LONG    r_MaxX
  151.         LONG    r_MinY
  152.         LONG    r_MaxY
  153.  
  154.     STRUCTURE RunningMachine,0
  155.         STRUCT    rm_MemoryRegion,4*MAX_MEMORY_REGIONS
  156.         STRUCT    rm_Gfx,4*MAX_GFX_ELEMENTS
  157.         APTR    rm_ScreenBitMap
  158.         APTR    rm_DirtyLayer
  159.         STRUCT    rm_Layer,4*MAX_LAYERS
  160.         APTR    rm_Pens
  161.         APTR    rm_ColorTable
  162.         APTR    rm_GameDriver
  163.         APTR    rm_MachineDriver
  164.         LONG    rm_SampleRate
  165.         LONG    rm_SampleBits
  166.         APTR    rm_Samples
  167.         APTR    rm_InputPorts
  168.         LONG    rm_Orientation
  169.         APTR    rm_UIFont
  170.         LONG    rm_UIWidth
  171.         LONG    rm_UIHeight
  172.         LONG    rm_UIXMin
  173.         LONG    rm_UIYMin
  174.  
  175. DUMP:    MACRO
  176.     IFD    DEBUG
  177.     movem.l    d0-d2/a0-a1/a6,-(sp)
  178.     move.l    \1,-(sp)
  179.     move.l    _DOSBase,a6
  180.     move.l    #DumpFormat,d1
  181.     move.l    sp,d2
  182.     CALL    VPrintf
  183.     addq.l    #4,sp
  184.     movem.l    (sp)+,d0-d2/a0-a1/a6
  185.     ENDC
  186.     ENDM
  187.  
  188.     IFD CUSTOMDRAWGFX
  189. _drawgfx_core8:
  190.     lea    4(sp),a0            ; a0.l -> DrawGfxArgs.
  191.  
  192.     tst.l    dga_GfxElement(a0)
  193.     req
  194.  
  195.     movem.l    d2-d7/a2-a6,-(sp)
  196.  
  197.     move.l    _Machine,a1
  198.     move.l    rm_Orientation(a1),d0
  199.  
  200.     move.l    dga_BitMap(a0),a2        ; a2.l -> destination OsdBitMap.
  201.     move.l    dga_GfxElement(a0),a3        ; a3.l -> source GfxElement.
  202.  
  203.     btst    #ORIENTB_SWAP_XY,d0
  204.     beq    dg_NoXYSwap
  205.  
  206.     move.l    dga_FlipX(a0),d1
  207.     move.l    dga_FlipY(a0),dga_FlipX(a0)
  208.     move.l    d1,dga_FlipY(a0)
  209.  
  210.     move.l    dga_StartX(a0),d3
  211.     move.l    dga_StartY(a0),d2
  212.  
  213.     move.l    dga_ClipRect(a0),d1
  214.     beq    dg_NoClip
  215.     move.l    d1,a1
  216.  
  217.     move.l    r_MinX(a1),d6
  218.     move.l    r_MaxX(a1),d7
  219.     move.l    r_MinY(a1),d4
  220.     move.l    r_MaxY(a1),d5
  221.  
  222.     bra    dg_FlipX
  223.  
  224. dg_NoXYSwap:
  225.     move.l    dga_StartX(a0),d2
  226.     move.l    dga_StartY(a0),d3
  227.  
  228.     move.l    dga_ClipRect(a0),d1
  229.     beq    dg_NoClip
  230.     move.l    d1,a1
  231.  
  232.     move.l    r_MinX(a1),d4
  233.     move.l    r_MaxX(a1),d5
  234.     move.l    r_MinY(a1),d6
  235.     move.l    r_MaxY(a1),d7
  236.  
  237.     bra    dg_FlipX
  238.  
  239. dg_NoClip:
  240.     moveq.l    #0,d4
  241.     add.l    obm_Width(a2),d5
  242.     subq.l    #1,d5
  243.     moveq.l    #0,d6
  244.     move.l    obm_Height(a2),d7
  245.     subq.l    #1,d7
  246.  
  247. ;-- Flip coordinates: -----------------------------------------------------
  248.  
  249. dg_FlipX:
  250.     btst    #ORIENTB_FLIP_X,d0
  251.     beq    dg_NoXFlip
  252.     neg.l    d2
  253.     add.l    obm_Width(a2),d2
  254.     sub.l    ge_Width(a3),d2
  255.     move.l    d4,d1
  256.     moveq    #-1,d4
  257.     add.l    obm_Width(a2),d4
  258.     sub.l    d5,d4
  259.     moveq    #-1,d5
  260.     add.l    obm_Width(a2),d5
  261.     sub.l    d1,d5
  262.  
  263. dg_NoXFlip:
  264.     btst    #ORIENTB_FLIP_Y,d0
  265.     beq    dg_NoYFlip
  266.     neg.l    d3
  267.     add.l    obm_Height(a2),d3
  268.     sub.l    ge_Height(a3),d3
  269.     move.l    d6,d1
  270.     moveq    #-1,d6
  271.     add.l    obm_Height(a2),d6
  272.     sub.l    d7,d6
  273.     moveq    #-1,d7
  274.     add.l    obm_Height(a2),d7
  275.     sub.l    d1,d7
  276.  
  277. dg_NoYFlip:
  278.  
  279. ;-- Clip coordinates: -----------------------------------------------------
  280.  
  281.     tst.l    d4
  282.     bpl    dg_NoClipClipStartX
  283.     moveq    #0,d4
  284. dg_NoClipClipStartX:
  285.     cmp.l    obm_Width(a2),d5
  286.     bmi    dg_NoClipClipEndX
  287.     move.l    obm_Width(a2),d5
  288.     subq.l    #1,d5
  289. dg_NoClipClipEndX:
  290.  
  291.     tst.l    d6
  292.     bpl    dg_NoClipClipStartY
  293.     moveq    #0,d6
  294. dg_NoClipClipStartY:
  295.     cmp.l    obm_Height(a2),d7
  296.     bmi    dg_NoClipClipEndY
  297.     move.l    obm_Height(a2),d7
  298.     subq.l    #1,d7
  299. dg_NoClipClipEndY:
  300.  
  301.     cmp.l    d4,d5
  302.     bmi    dg_Done
  303.     cmp.l    d6,d7
  304.     bmi    dg_Done
  305.  
  306.     cmp.l    d2,d5
  307.     bmi    dg_Done
  308.     move.l    d2,d1
  309.     add.l    ge_Width(a3),d1
  310.     subq.l    #1,d1
  311.     cmp.l    d4,d1
  312.     bmi    dg_Done
  313.     cmp.l    d4,d2
  314.     bpl    dg_NoClipStartX
  315.     sub.l    d4,d2
  316.     neg.l    d2
  317.     bra    dg_ClipEndX
  318. dg_NoClipStartX:
  319.     move.l    d2,d4
  320.     moveq    #0,d2
  321. dg_ClipEndX:
  322.     cmp.l    d5,d1
  323.     bpl    dg_DoClipEndX
  324.     move.l    d1,d5
  325. dg_DoClipEndX:
  326.  
  327.     cmp.l    d3,d7
  328.     bmi    dg_Done
  329.     move.l    d3,d1
  330.     add.l    ge_Height(a3),d1
  331.     subq.l    #1,d1
  332.     cmp.l    d6,d1
  333.     bmi    dg_Done
  334.     cmp.l    d6,d3
  335.     bpl    dg_NoClipStartY
  336.     sub.l    d6,d3
  337.     neg.l    d3
  338.     bra    dg_ClipEndY
  339. dg_NoClipStartY:
  340.     move.l    d3,d6
  341.     moveq    #0,d3
  342. dg_ClipEndY:
  343.     cmp.l    d7,d1
  344.     bpl    dg_DoClipEndY
  345.     move.l    d1,d7
  346. dg_DoClipEndY:
  347.  
  348. ;-- Prepare for loops: ----------------------------------------------------
  349.  
  350.     lsl.l    #2,d6
  351.     move.l    obm_Line(a2),a5
  352.     lea    (a5,d6.l),a5            ; a5.l -> destination line pointer array.
  353.     lsr.l    #2,d6
  354.  
  355.     sub.l    d6,d7                ; d7.l =  y loop counter.
  356.  
  357.     move.w    #4,a2
  358.  
  359.     move.l    ge_TotalElements(a3),d0
  360.     move.l    dga_Code(a0),d1
  361.     divu    d0,d1
  362.     swap    d1
  363.     move.l    ge_Height(a3),d0
  364.     mulu    d0,d1
  365.     add.l    d3,d1
  366.     tst.l    dga_FlipY(a0)
  367.     beq    dg_NoFlipY
  368.     add.l    d7,d1
  369.     move.w    #-4,a2
  370. dg_NoFlipY:
  371.     lsl.l    #2,d1
  372.     move.l    ge_BitMap(a3),a4
  373.     move.l    obm_Line(a4),a4
  374.     lea    (a4,d1.l),a4            ; a4.l -> source line pointer array.
  375.  
  376.     sub.l    d4,d5                ; d5.l =  x loop counter.
  377.  
  378.     tst.l    dga_FlipX(a0)
  379.     beq    dg_NoFlipX
  380.     neg.l    d2
  381.     add.l    ge_Width(a3),d2
  382. dg_NoFlipX:
  383.  
  384. ;-- Update delta buffer: --------------------------------------------------
  385.  
  386. ;    move.l    _DeltaBuf,d0
  387. ;    beq    dg_NoDeltaBuf
  388. ;
  389. ;    movem.l    d2/d4,-(sp)
  390. ;
  391. ;    move.l    d0,a1
  392. ;
  393. ;    move.l    _DeltaHShift,d0
  394. ;    lsr.l    d0,d6
  395. ;    mulu    _DeltaW,d6
  396. ;    move.l    d7,d2
  397. ;    add.l    _DeltaH,d2
  398. ;    add.l    d6,a1
  399. ;    lsr.l    d0,d2
  400. ;
  401. ;    move.l    _DeltaWShift,d0
  402. ;    lsr.l    d0,d4
  403. ;    move.l    d5,d1
  404. ;    add.l    _DeltaW,d1
  405. ;    add.l    d4,a1
  406. ;    lsr.l    d0,d1
  407. ;
  408. ;    moveq    #1,d0
  409. ;    move.l    _DeltaW,d6
  410. ;    sub.l    d1,d6
  411. ;    subq.l    #1,d1
  412. ;    subq.l    #1,d2
  413. ;
  414. ;dg_DeltaYLoop:
  415. ;    move.l    d1,d4
  416. ;dg_DeltaXLoop:
  417. ;    move.b    d0,(a1)+
  418. ;    dbf    d4,dg_DeltaXLoop
  419. ;    add.l    d6,a1
  420. ;    dbf    d2,dg_DeltaYLoop
  421. ;
  422. ;    movem.l    (sp)+,d2/d4
  423. ;dg_NoDeltaBuf:
  424.  
  425. ;-- Color parameters: -----------------------------------------------------
  426.  
  427.     move.l    ge_ColorTable(a3),d6
  428.     beq    dg_NoColorOffset
  429.     move.l    dga_Color(a0),d0
  430.     move.l    ge_TotalColors(a3),d3
  431.     divu    d3,d0
  432.     swap    d0
  433.     move.l    ge_ColorGranuality(a3),d3
  434.     mulu    d0,d3
  435.     add.l    d3,d6
  436.     move.l    d6,a6
  437. dg_NoColorOffset:
  438.  
  439.     move.l    dga_Trans(a0),d3
  440.     beq    dg_TransNone
  441.     move.l    dga_TransColor(a0),d0
  442.     cmp.l    #TRANS_PEN,d3
  443.     beq    dg_TransPen
  444.     move.l    _Machine,a1
  445.     move.l    rm_Pens(a1),a1
  446.     move.b    (a1,d0.w),d0
  447.     cmp.l    #TRANS_THROUGH,d3
  448.     beq    dg_TransThrough
  449.  
  450. ;-- Transparent color: ----------------------------------------------------
  451.  
  452. dg_TransColor:
  453.     moveq    #0,d3
  454.  
  455.     tst.l    d6
  456.     beq    dg_TPCNoRemap
  457.  
  458.     tst.l    dga_FlipX(a0)
  459.     bne    dg_TCYLoopFlip
  460.  
  461. dg_TCYLoop:
  462.     move.l    d5,d1
  463.     move.l    (a4),a0
  464.     move.l    (a5)+,a1
  465.     add.l    d2,a0
  466.     add.l    d4,a1
  467. dg_TCXLoop:
  468.     move.b    (a0)+,d3
  469.     move.b    (a6,d3.w),d3
  470.     cmp.b    d0,d3
  471.     beq    dg_TCTrans
  472.     move.b    d3,(a1)
  473. dg_TCTrans:
  474.     addq.l    #1,a1
  475.     dbf    d1,dg_TCXLoop
  476.     add.l    a2,a4
  477.     dbf    d7,dg_TCYLoop
  478.  
  479.     bra    dg_Done
  480.  
  481. dg_TCYLoopFlip:
  482.     move.l    d5,d1
  483.     move.l    (a4),a0
  484.     move.l    (a5)+,a1
  485.     add.l    d2,a0
  486.     add.l    d4,a1
  487. dg_TCXLoopFlip:
  488.     move.b    -(a0),d3
  489.     move.b    (a6,d3.w),d3
  490.     cmp.b    d0,d3
  491.     beq    dg_TCTransFlip
  492.     move.b    d3,(a1)
  493. dg_TCTransFlip:
  494.     addq.l    #1,a1
  495.     dbf    d1,dg_TCXLoopFlip
  496.     add.l    a2,a4
  497.     dbf    d7,dg_TCYLoopFlip
  498.  
  499.     bra    dg_Done
  500.  
  501. ;-- Transparent pen: ------------------------------------------------------
  502.  
  503. dg_TransPen:
  504.     moveq    #0,d3
  505.  
  506.     tst.l    d6
  507.     beq    dg_TPCNoRemap
  508.  
  509.     tst.l    dga_FlipX(a0)
  510.     bne    dg_TPYLoopFlip
  511.  
  512. dg_TPYLoop:
  513.     move.l    d5,d1
  514.     move.l    (a4),a0
  515.     move.l    (a5)+,a1
  516.     add.l    d2,a0
  517.     add.l    d4,a1
  518. dg_TPXLoop:
  519.     move.b    (a0)+,d3
  520.     cmp.b    d0,d3
  521.     beq    dg_TPTrans
  522.     move.b    (a6,d3.w),d3
  523.     move.b    d3,(a1)
  524. dg_TPTrans:
  525.     addq.l    #1,a1
  526.     dbf    d1,dg_TPXLoop
  527.     add.l    a2,a4
  528.     dbf    d7,dg_TPYLoop
  529.  
  530.     bra    dg_Done
  531.  
  532. dg_TPYLoopFlip:
  533.     move.l    d5,d1
  534.     move.l    (a4),a0
  535.     move.l    (a5)+,a1
  536.     add.l    d2,a0
  537.     add.l    d4,a1
  538. dg_TPXLoopFlip:
  539.     move.b    -(a0),d3
  540.     cmp.b    d0,d3
  541.     beq    dg_TPTransFlip
  542.     move.b    (a6,d3.w),d3
  543.     move.b    d3,(a1)
  544. dg_TPTransFlip:
  545.     addq.l    #1,a1
  546.     dbf    d1,dg_TPXLoopFlip
  547.     add.l    a2,a4
  548.     dbf    d7,dg_TPYLoopFlip
  549.  
  550.     bra    dg_Done
  551.  
  552. ;-- Transparent pen or color with no remapping: ---------------------------
  553.  
  554. dg_TPCNoRemap:
  555.     tst.l    dga_FlipX(a0)
  556.     bne    dg_TPCYLoopFlipNR
  557.  
  558. dg_TPCYLoopNR:
  559.     move.l    d5,d1
  560.     move.l    (a4),a0
  561.     move.l    (a5)+,a1
  562.     add.l    d2,a0
  563.     add.l    d4,a1
  564. dg_TPCXLoopNR:
  565.     move.b    (a0)+,d3
  566.     cmp.b    d0,d3
  567.     beq    dg_TPCTransNR
  568.     move.b    d3,(a1)
  569. dg_TPCTransNR:
  570.     addq.l    #1,a1
  571.     dbf    d1,dg_TPCXLoopNR
  572.     add.l    a2,a4
  573.     dbf    d7,dg_TPCYLoopNR
  574.  
  575.     bra    dg_Done
  576.  
  577. dg_TPCYLoopFlipNR:
  578.     move.l    d5,d1
  579.     move.l    (a4),a0
  580.     move.l    (a5)+,a1
  581.     add.l    d2,a0
  582.     add.l    d4,a1
  583. dg_TPCXLoopFlipNR:
  584.     move.b    -(a0),d3
  585.     cmp.b    d0,d3
  586.     beq    dg_TPCTransFlipNR
  587.     move.b    d3,(a1)
  588. dg_TPCTransFlipNR:
  589.     addq.l    #1,a1
  590.     dbf    d1,dg_TPCXLoopFlipNR
  591.     add.l    a2,a4
  592.     dbf    d7,dg_TPCYLoopFlipNR
  593.  
  594.     bra    dg_Done
  595.  
  596. ;-- No transparenncy: -----------------------------------------------------
  597.  
  598. dg_TransNone:
  599.     moveq    #0,d3
  600.  
  601.     tst.l    d6
  602.     beq    dg_TNNoRemap
  603.  
  604.     tst.l    dga_FlipX(a0)
  605.     bne    dg_TNYLoopFlip
  606.  
  607. dg_TNYLoop:
  608.     move.l    d5,d1
  609.     move.l    (a4),a0
  610.     move.l    (a5)+,a1
  611.     add.l    d2,a0
  612.     add.l    d4,a1
  613. dg_TNXLoop:
  614.     move.b    (a0)+,d3
  615.     move.b    (a6,d3.w),d3
  616.     move.b    d3,(a1)+
  617.     dbf    d1,dg_TNXLoop
  618.     add.l    a2,a4
  619.     dbf    d7,dg_TNYLoop
  620.  
  621.     bra    dg_Done
  622.  
  623. dg_TNYLoopFlip:
  624.     move.l    d5,d1
  625.     move.l    (a4),a0
  626.     move.l    (a5)+,a1
  627.     add.l    d2,a0
  628.     add.l    d4,a1
  629. dg_TNXLoopFlip:
  630.     move.b    -(a0),d3
  631.     move.b    (a6,d3.w),d3
  632.     move.b    d3,(a1)+
  633.     dbf    d1,dg_TNXLoopFlip
  634.     add.l    a2,a4
  635.     dbf    d7,dg_TNYLoopFlip
  636.  
  637.     bra    dg_Done
  638.  
  639. dg_TNNoRemap:
  640.     moveq    #3,d3
  641.  
  642.     tst.l    dga_FlipX(a0)
  643.     bne    dg_TNYLoopFlipNR
  644.  
  645.     move.l    d2,d1
  646.     eor.l    d4,d1
  647.     and.l    d3,d1
  648.     bne    dg_TNYLoopNR
  649.     move.l    d2,d1
  650.     or.l    d4,d1
  651.     and.l    d3,d1
  652.     beq    dg_TNAlignedNR
  653.  
  654.     movem.l    a4/a5/d7,-(sp)
  655.  
  656.     move.l    d4,d1
  657.     and.l    d3,d1
  658.     subq.l    #1,d1
  659.     beq    dg_TN1LoopNR
  660.     subq.l    #1,d1
  661.     beq    dg_TN2LoopNR
  662.  
  663. dg_TN3LoopNR:
  664.     move.l    (a4),a0
  665.     move.l    (a5)+,a1
  666.     add.l    d2,a0
  667.     add.l    d4,a1
  668.     move.b    (a0)+,(a1)+
  669.     move.b    (a0)+,(a1)+
  670.     move.b    (a0)+,(a1)+
  671.     add.l    a2,a4
  672.     dbf    d7,dg_TN3LoopNR
  673.  
  674.     bra    dg_TNDoAlignedNR
  675.  
  676. dg_TN2LoopNR:
  677.     move.l    (a4),a0
  678.     move.l    (a5)+,a1
  679.     add.l    d2,a0
  680.     add.l    d4,a1
  681.     move.b    (a0)+,(a1)+
  682.     move.b    (a0)+,(a1)+
  683.     add.l    a2,a4
  684.     dbf    d7,dg_TN3LoopNR
  685.  
  686.     bra    dg_TNDoAlignedNR
  687.  
  688. dg_TN1LoopNR:
  689.     move.l    (a4),a0
  690.     move.l    (a5)+,a1
  691.     add.l    d2,a0
  692.     add.l    d4,a1
  693.     move.b    (a0),(a1)
  694.     add.l    a2,a4
  695.     dbf    d7,dg_TN3LoopNR
  696.  
  697. dg_TNDoAlignedNR:
  698.     movem.l    (sp)+,a4/a5/d7
  699.     move.l    d4,d1
  700.     and.l    d3,d1
  701.     add.l    d1,d2
  702.     add.l    d1,d4
  703.     sub.l    d1,d5
  704.  
  705. dg_TNAlignedNR:
  706.     move.l    d5,d1
  707.     lsr.l    #2,d1
  708.     beq    dg_TNYLoopNR
  709.  
  710.     movem.l    a4/a5/d5/d7,-(sp)
  711.  
  712. dg_TNYLoopANR:
  713.     move.l    d1,d5
  714.     move.l    (a4),a0
  715.     move.l    (a5)+,a1
  716.     add.l    d2,a0
  717.     add.l    d4,a1
  718. dg_TNXLoopANR:
  719.     move.l    (a0)+,(a1)+
  720.     dbf    d5,dg_TNXLoopANR
  721.     add.l    a2,a4
  722.     dbf    d7,dg_TNYLoopANR
  723.  
  724.     movem.l    (sp)+,a4/a5/d5/d7
  725.     lsl.l    #2,d1
  726.     add.l    d1,d2
  727.     add.l    d1,d4
  728.     sub.l    d1,d5
  729.  
  730. dg_TNYLoopNR:
  731.     move.l    d5,d1
  732.     move.l    (a4),a0
  733.     move.l    (a5)+,a1
  734.     add.l    d2,a0
  735.     add.l    d4,a1
  736. dg_TNXLoopNR:
  737.     move.b    (a0)+,(a1)+
  738.     dbf    d1,dg_TNXLoopNR
  739.     add.l    a2,a4
  740.     dbf    d7,dg_TNYLoopNR
  741.  
  742.     bra    dg_Done
  743.  
  744. dg_TNYLoopFlipNR:
  745.     move.l    d5,d1
  746.     move.l    (a4),a0
  747.     move.l    (a5)+,a1
  748.     add.l    d2,a0
  749.     add.l    d4,a1
  750. dg_TNXLoopFlipNR:
  751.     move.b    -(a0),(a1)+
  752.     dbf    d1,dg_TNXLoopFlipNR
  753.     add.l    a2,a4
  754.     dbf    d7,dg_TNYLoopFlipNR
  755.  
  756.     bra    dg_Done
  757.  
  758. ;-- Write though transparent destination: ---------------------------------
  759.  
  760. dg_TransThrough:
  761.     moveq    #0,d3
  762.  
  763.     tst.l    d6
  764.     beq    dg_TTNoRemap
  765.  
  766.     tst.l    dga_FlipX(a0)
  767.     bne    dg_TTYLoopFlip
  768.  
  769. dg_TTYLoop:
  770.     move.l    d5,d1
  771.     move.l    (a4),a0
  772.     move.l    (a5)+,a1
  773.     add.l    d2,a0
  774.     add.l    d4,a1
  775. dg_TTXLoop:
  776.     cmp.b    (a1),d0
  777.     bne    dg_TTTrans
  778.     move.b    (a0),d3
  779.     move.b    (a6,d3.w),d3
  780.     move.b    d3,(a1)
  781. dg_TTTrans:
  782.     addq.l    #1,a0
  783.     addq.l    #1,a1
  784.     dbf    d1,dg_TTXLoop
  785.     add.l    a2,a4
  786.     dbf    d7,dg_TTYLoop
  787.  
  788.     bra    dg_Done
  789.  
  790. dg_TTYLoopFlip:
  791.     move.l    d5,d1
  792.     move.l    (a4),a0
  793.     move.l    (a5)+,a1
  794.     add.l    d2,a0
  795.     add.l    d4,a1
  796. dg_TTXLoopFlip:
  797.     subq.l    #1,a0
  798.     cmp.b    (a1),d0
  799.     bne    dg_TTTransFlip
  800.     move.b    (a0),d3
  801.     move.b    (a6,d3.w),d3
  802.     move.b    d3,(a1)
  803. dg_TTTransFlip:
  804.     addq.l    #1,a1
  805.     dbf    d1,dg_TTXLoopFlip
  806.     add.l    a2,a4
  807.     dbf    d7,dg_TTYLoopFlip
  808.  
  809.     bra    dg_Done
  810.  
  811. dg_TTNoRemap:
  812.     tst.l    dga_FlipX(a0)
  813.     bne    dg_TTYLoopFlipNR
  814.  
  815. dg_TTYLoopNR:
  816.     move.l    d5,d1
  817.     move.l    (a4),a0
  818.     move.l    (a5)+,a1
  819.     add.l    d2,a0
  820.     add.l    d4,a1
  821. dg_TTXLoopNR:
  822.     cmp.b    (a1),d0
  823.     bne    dg_TTTransNR
  824.     move.b    (a0),(a1)
  825. dg_TTTransNR:
  826.     addq.l    #1,a0
  827.     addq.l    #1,a1
  828.     dbf    d1,dg_TTXLoopNR
  829.     add.l    a2,a4
  830.     dbf    d7,dg_TTYLoopNR
  831.  
  832.     bra    dg_Done
  833.  
  834. dg_TTYLoopFlipNR:
  835.     move.l    d5,d1
  836.     move.l    (a4),a0
  837.     move.l    (a5)+,a1
  838.     add.l    d2,a0
  839.     add.l    d4,a1
  840. dg_TTXLoopFlipNR:
  841.     subq.l    #1,a0
  842.     cmp.b    (a1),d0
  843.     bne    dg_TTTransFlipNR
  844.     move.b    (a0),(a1)
  845. dg_TTTransFlipNR:
  846.     addq.l    #1,a1
  847.     dbf    d1,dg_TTXLoopFlipNR
  848.     add.l    a2,a4
  849.     dbf    d7,dg_TTYLoopFlipNR
  850.  
  851. dg_Done:
  852.     movem.l    (sp)+,d2-d7/a2-a6
  853.     rts
  854.     ENDC
  855.  
  856.     IFD    DEBUG
  857. DumpFormat:
  858.     dc.b    "%08lx",10,0
  859.     even
  860.     ENDC
  861.  
  862. ***************************************************************************
  863.  
  864.     IFD CUSTOMDRAWGFX
  865. _clearbitmap:
  866.     move.l    4(sp),a0
  867. ;    move.l    _DeltaBuf,d0
  868. ;    beq    cbm_ClearBitMap
  869. ;
  870. ;    move.l    d0,a1
  871. ;    move.l    _DeltaW,d0
  872. ;    move.l    _DeltaH,d1
  873. ;    mulu    d0,d1
  874. ;    subq.l    #1,d1
  875. ;    moveq    #1,d0
  876. ;cbm_DeltaLoop:
  877. ;    move.b    d0,(a1)+
  878. ;    dbf    d1,cbm_DeltaLoop
  879.  
  880. cbm_ClearBitMap:
  881.     move.l    d2,-(sp)
  882.     move.l    obm_Width(a0),d0
  883.     beq    cbm_Done
  884.     move.l    obm_Height(a0),d1
  885.     beq    cbm_Done
  886.     move.l    obm_Line(a0),a0
  887.     subq.l    #1,d0
  888.     subq.l    #1,d1
  889. cbm_ClearYLoop:
  890.     move.l    (a0)+,a1
  891.     move.l    d0,d2
  892. cbm_ClearXLoop:
  893.     clr.b    (a1)+
  894.     dbf    d2,cbm_ClearXLoop
  895.     dbf    d1,cbm_ClearYLoop
  896.  
  897. cbm_Done:
  898.     move.l    (sp)+,d2
  899.     rts
  900.     ENDC
  901.  
  902. ***************************************************************************
  903.  
  904. ; a0.l -> source buffer.
  905. ; a1.l -> destination buffer.
  906. ; a2.l -> remap table.
  907. ; d0.l =  source width.
  908. ; d1.l =  destination bytes per row.
  909. ; d2.l =  height.
  910. ; d3.l =  source bytes per row.
  911.  
  912. _RemapPixels:
  913.     movem.l    a3/d2-d7,-(sp)
  914.     sub.l    d0,d1
  915.     sub.l    d0,d3
  916.     move.l    d3,a3
  917.     move.l    d0,d3
  918.     lsr.l    #2,d0
  919.     lsl.l    #2,d0
  920.     sub.l    d0,d3
  921.     lsr.l    #2,d0
  922.     subq.l    #1,d0
  923.     subq.l    #1,d2
  924.     subq.l    #1,d3
  925.     moveq    #0,d7
  926. r_YLoop:
  927.     move.l    d0,d4
  928. r_X1Loop:
  929.     move.l    (a0)+,d5
  930.     rol.l    #8,d5
  931.     move.b    d5,d7
  932.     move.b    (a2,d7.w),d6
  933.     lsl.l    #8,d6
  934.     rol.l    #8,d5
  935.     move.b    d5,d7
  936.     move.b    (a2,d7.w),d6
  937.     lsl.l    #8,d6
  938.     rol.l    #8,d5
  939.     move.b    d5,d7
  940.     move.b    (a2,d7.w),d6
  941.     lsl.l    #8,d6
  942.     rol.l    #8,d5
  943.     move.b    d5,d7
  944.     move.b    (a2,d7.w),d6
  945.     move.l    d6,(a1)+
  946.     dbf    d4,r_X1Loop
  947.     move.l    d3,d4
  948.     bmi    r_X2Done
  949. r_X2Loop:
  950.     move.b    (a0)+,d7
  951.     move.b    (a2,d7.w),(a1)+
  952.     dbf    d4,r_X2Loop
  953.     addq.l    #3,a1
  954.     sub.l    d3,a1
  955. r_X2Done:
  956.     add.l    d1,a1
  957.     add.l    a3,a0
  958.  
  959.     dbf    d2,r_YLoop
  960.     movem.l    (sp)+,a3/d2-d7
  961.     rts
  962.  
  963.  
  964.     IFD CUSTOMMEM
  965. _mrh_ram:
  966. _mrh_error:
  967.     move.l    4(sp),a0
  968.     add.l    _RAM,a0
  969.     moveq    #0,d0
  970.     move.b    (a0),d0
  971.     rts
  972.  
  973. _mrh_bank1:
  974.     move.l    4(sp),a0
  975.     add.l    _cpu_bankbase+4,a0
  976.     moveq    #0,d0
  977.     move.b    (a0),d0
  978.     rts
  979.  
  980. _mrh_bank2:
  981.     move.l    4(sp),a0
  982.     add.l    _cpu_bankbase+8,a0
  983.     moveq    #0,d0
  984.     move.b    (a0),d0
  985.     rts
  986.  
  987. _mrh_bank3:
  988.     move.l    4(sp),a0
  989.     add.l    _cpu_bankbase+12,a0
  990.     moveq    #0,d0
  991.     move.b    (a0),d0
  992.     rts
  993.  
  994. _mrh_bank4:
  995.     move.l    4(sp),a0
  996.     add.l    _cpu_bankbase+16,a0
  997.     moveq    #0,d0
  998.     move.b    (a0),d0
  999.     rts
  1000.  
  1001. _mrh_bank5:
  1002.     move.l    4(sp),a0
  1003.     add.l    _cpu_bankbase+20,a0
  1004.     moveq    #0,d0
  1005.     move.b    (a0),d0
  1006.     rts
  1007.  
  1008. _mrh_nop:
  1009. _mrh_error_sparse:
  1010.     moveq    #0,d0
  1011.     rts
  1012.  
  1013. _mwh_ram:
  1014. _mwh_error:
  1015.     move.l    4(sp),a0
  1016.     add.l    _RAM,a0
  1017.     move.b    11(sp),(a0)
  1018.     rts
  1019.  
  1020. _mwh_bank1:
  1021.     move.l    4(sp),a0
  1022.     add.l    _cpu_bankbase+4,a0
  1023.     move.b    11(sp),(a0)
  1024.     rts
  1025.  
  1026. _mwh_bank2:
  1027.     move.l    4(sp),a0
  1028.     add.l    _cpu_bankbase+8,a0
  1029.     move.b    11(sp),(a0)
  1030.     rts
  1031.  
  1032. _mwh_bank3:
  1033.     move.l    4(sp),a0
  1034.     add.l    _cpu_bankbase+12,a0
  1035.     move.b    11(sp),(a0)
  1036.     rts
  1037.  
  1038. _mwh_bank4:
  1039.     move.l    4(sp),a0
  1040.     add.l    _cpu_bankbase+16,a0
  1041.     move.b    11(sp),(a0)
  1042.     rts
  1043.  
  1044. _mwh_bank5:
  1045.     move.l    4(sp),a0
  1046.     add.l    _cpu_bankbase+20,a0
  1047.     move.b    11(sp),(a0)
  1048.     rts
  1049.  
  1050. _mwh_nop:
  1051. _mwh_error_sparse:
  1052. _mwh_rom:
  1053.     rts
  1054.  
  1055. _mwh_ramrom:
  1056.     move.l    4(sp),a0
  1057.     move.l    _RAM,a1
  1058.     move.b    11(sp),(a0,a1.l)
  1059.     move.l    _ROM,a1
  1060.     move.b    11(sp),(a0,a1.l)
  1061.     rts
  1062.  
  1063. _cpu_readmem16:
  1064.     move.l    4(sp),d0
  1065.     move.l    d0,a1
  1066.     lsr.l    #ABITS2_16+ABITS_MIN_16,d0
  1067.     move.l    _cur_mrhard,a0
  1068.     move.b    (a0,d0.l),d0
  1069.     bne    crm16_NotRAM
  1070.     add.l    _RAM,a1
  1071.     moveq    #0,d0
  1072.     move.b    (a1),d0
  1073.     rts
  1074. crm16_NotRAM:
  1075.     cmp.b    #MH_HARDMAX,d0
  1076.     bmi    crm16_NotRAM2
  1077.     sub.b    #MH_HARDMAX,d0
  1078.     lsl.w    #MH_SBITS,d0            ; MH_SBITS = 8.
  1079.     move.l    a1,d1
  1080. ;    lsr.l    #ABITS_MIN_16,d1        ; ABITS_MIN_16 = 0.
  1081.     and.l    #$f,d1                ; $ffffffff >> (32 - ABITS2_16).
  1082.     lea    _readhardware,a0
  1083.     add.w    d0,a0
  1084.     move.b    (a0,d1.l),d0
  1085.     bne    crm16_NotRAM2
  1086.     add.l    _RAM,a1
  1087.     moveq    #0,d0
  1088.     move.b    (a1),d0
  1089.     rts
  1090. crm16_NotRAM2:
  1091.     moveq    #0,d1
  1092.     move.b    d0,d1
  1093.     lsl.l    #2,d1
  1094.     lea    _memoryreadoffset,a0
  1095.     sub.l    (a0,d1.l),a1
  1096.     move.l    a1,4(sp)
  1097.     lea    _memoryreadhandler,a0
  1098.     move.l    (a0,d1.l),a0
  1099.     jmp    (a0)
  1100.  
  1101. _cpu_writemem16:
  1102.     move.l    4(sp),d0
  1103.     move.l    d0,a1
  1104.     lsr.l    #ABITS2_16+ABITS_MIN_16,d0
  1105.     move.l    _cur_mwhard,a0
  1106.     move.b    (a0,d0.l),d0
  1107.     bne    cwm16_NotRAM
  1108.     add.l    _RAM,a1
  1109.     move.b    11(sp),(a1)
  1110.     rts
  1111. cwm16_NotRAM:
  1112.     cmp.b    #MH_HARDMAX,d0
  1113.     bmi    cwm16_NotRAM2
  1114.     sub.b    #MH_HARDMAX,d0
  1115.     lsl.w    #MH_SBITS,d0
  1116.     move.l    a1,d1
  1117. ;    lsr.l    #ABITS_MIN_16,d1        ; ABITS_MIN_16 = 0.
  1118.     and.l    #$f,d1                ; $ffffffff >> (32 - ABITS2_16).
  1119.     lea    _writehardware,a0
  1120.     add.w    d0,a0
  1121.     move.b    (a0,d1.l),d0
  1122.     bne    cwm16_NotRAM2
  1123.     add.l    _RAM,a1
  1124.     move.b    11(sp),(a1)
  1125.     rts
  1126. cwm16_NotRAM2:
  1127.     moveq    #0,d1
  1128.     move.b    d0,d1
  1129.     lsl.l    #2,d1
  1130.     lea    _memorywriteoffset,a0
  1131.     sub.l    (a0,d1.l),a1
  1132.     move.l    a1,4(sp)
  1133.     lea    _memorywritehandler,a0
  1134.     move.l    (a0,d1.l),a0
  1135.     jmp    (a0)
  1136.  
  1137. _cpu_readmem20:
  1138.     move.l    4(sp),d0
  1139.     move.l    d0,a1
  1140.     lsr.l    #ABITS2_20+ABITS_MIN_20,d0
  1141.     move.l    _cur_mrhard,a0
  1142.     move.b    (a0,d0.l),d0
  1143.     bne    crm20_NotRAM
  1144.     add.l    _RAM,a1
  1145.     moveq    #0,d0
  1146.     move.b    (a1),d0
  1147.     rts
  1148. crm20_NotRAM:
  1149.     cmp.b    #MH_HARDMAX,d0
  1150.     bmi    crm20_NotRAM2
  1151.     sub.b    #MH_HARDMAX,d0
  1152.     lsl.w    #MH_SBITS,d0            ; MH_SBITS = 8.
  1153.     move.l    a1,d1
  1154. ;    lsr.l    #ABITS_MIN_20,d1        ; ABITS_MIN_20 = 0.
  1155.     and.l    #$ff,d1                ; $ffffffff >> (32 - ABITS2_20).
  1156.     lea    _readhardware,a0
  1157.     add.w    d0,a0
  1158.     move.b    (a0,d1.l),d0
  1159.     bne    crm20_NotRAM2
  1160.     add.l    _RAM,a1
  1161.     moveq    #0,d0
  1162.     move.b    (a1),d0
  1163.     rts
  1164. crm20_NotRAM2:
  1165.     moveq    #0,d1
  1166.     move.b    d0,d1
  1167.     lsl.l    #2,d1
  1168.     lea    _memoryreadoffset,a0
  1169.     sub.l    (a0,d1.l),a1
  1170.     move.l    a1,4(sp)
  1171.     lea    _memoryreadhandler,a0
  1172.     move.l    (a0,d1.l),a0
  1173.     jmp    (a0)
  1174.  
  1175. _cpu_writemem20:
  1176.     move.l    4(sp),d0
  1177.     move.l    d0,a1
  1178.     lsr.l    #ABITS2_20+ABITS_MIN_20,d0
  1179.     move.l    _cur_mwhard,a0
  1180.     move.b    (a0,d0.l),d0
  1181.     bne    cwm20_NotRAM
  1182.     add.l    _RAM,a1
  1183.     move.b    11(sp),(a1)
  1184.     rts
  1185. cwm20_NotRAM:
  1186.     cmp.b    #MH_HARDMAX,d0
  1187.     bmi    cwm20_NotRAM2
  1188.     sub.b    #MH_HARDMAX,d0
  1189.     lsl.w    #MH_SBITS,d0
  1190.     move.l    a1,d1
  1191. ;    lsr.l    #ABITS_MIN_20,d1        ; ABITS_MIN_20 = 0.
  1192.     and.l    #$ff,d1                ; $ffffffff >> (32 - ABITS2_20).
  1193.     lea    _writehardware,a0
  1194.     add.w    d0,a0
  1195.     move.b    (a0,d1.l),d0
  1196.     bne    cwm20_NotRAM2
  1197.     add.l    _RAM,a1
  1198.     move.b    11(sp),(a1)
  1199.     rts
  1200. cwm20_NotRAM2:
  1201.     moveq    #0,d1
  1202.     move.b    d0,d1
  1203.     lsl.l    #2,d1
  1204.     lea    _memorywriteoffset,a0
  1205.     sub.l    (a0,d1.l),a1
  1206.     move.l    a1,4(sp)
  1207.     lea    _memorywritehandler,a0
  1208.     move.l    (a0,d1.l),a0
  1209.     jmp    (a0)
  1210.  
  1211. _cpu_readmem24:
  1212.     move.l    4(sp),d0
  1213.     move.l    d0,a1
  1214.     lsr.l    #ABITS2_24,d0
  1215.     lsr.l    #ABITS_MIN_24,d0
  1216.     move.l    _cur_mrhard,a0
  1217.     move.b    (a0,d0.l),d0
  1218.     bne    crm24_NotRAM
  1219.     add.l    _RAM,a1
  1220.     moveq    #0,d0
  1221.     move.b    (a1),d0
  1222.     rts
  1223. crm24_NotRAM:
  1224.     cmp.b    #MH_HARDMAX,d0
  1225.     bmi    crm24_NotRAM2
  1226.     sub.b    #MH_HARDMAX,d0
  1227.     lsl.w    #MH_SBITS,d0            ; MH_SBITS = 8.
  1228.     move.l    a1,d1
  1229.     lsr.l    #ABITS_MIN_24,d1        ; ABITS_MIN_24 = 0.
  1230.     and.l    #$ff,d1                ; $ffffffff >> (32 - ABITS2_24).
  1231.     lea    _readhardware,a0
  1232.     add.w    d0,a0
  1233.     move.b    (a0,d1.l),d0
  1234.     bne    crm24_NotRAM2
  1235.     add.l    _RAM,a1
  1236.     moveq    #0,d0
  1237.     move.b    (a1),d0
  1238.     rts
  1239. crm24_NotRAM2:
  1240.     moveq    #0,d1
  1241.     move.b    d0,d1
  1242.     lsl.l    #2,d1
  1243.     lea    _memoryreadoffset,a0
  1244.     sub.l    (a0,d1.l),a1
  1245.     move.l    a1,4(sp)
  1246.     lea    _memoryreadhandler,a0
  1247.     move.l    (a0,d1.l),a0
  1248.     jmp    (a0)
  1249.  
  1250. _cpu_writemem24:
  1251.     move.l    4(sp),d0
  1252.     move.l    d0,a1
  1253.     lsr.l    #ABITS2_24,d0
  1254.     lsr.l    #ABITS_MIN_24,d0
  1255.     move.l    _cur_mwhard,a0
  1256.     move.b    (a0,d0.l),d0
  1257.     bne    cwm24_NotRAM
  1258.     add.l    _RAM,a1
  1259.     move.b    11(sp),(a1)
  1260.     rts
  1261. cwm24_NotRAM:
  1262.     cmp.b    #MH_HARDMAX,d0
  1263.     bmi    cwm24_NotRAM2
  1264.     sub.b    #MH_HARDMAX,d0
  1265.     lsl.w    #MH_SBITS,d0
  1266.     move.l    a1,d1
  1267.     lsr.l    #ABITS_MIN_24,d1        ; ABITS_MIN_24 = 2.
  1268.     and.l    #$ff,d1                ; $ffffffff >> (32 - ABITS2_24).
  1269.     lea    _writehardware,a0
  1270.     add.w    d0,a0
  1271.     move.b    (a0,d1.l),d0
  1272.     bne    cwm24_NotRAM2
  1273.     add.l    _RAM,a1
  1274.     move.b    11(sp),(a1)
  1275.     rts
  1276. cwm24_NotRAM2:
  1277.     moveq    #0,d1
  1278.     move.b    d0,d1
  1279.     lsl.l    #2,d1
  1280.     lea    _memorywriteoffset,a0
  1281.     sub.l    (a0,d1.l),a1
  1282.     move.l    a1,4(sp)
  1283.     lea    _memorywritehandler,a0
  1284.     move.l    (a0,d1.l),a0
  1285.     jmp    (a0)
  1286.  
  1287.     ENDC
  1288.